import wx from 'weixin-js-sdk'
import { http as $api } from '@/common/api/index.js';
/**
 * 微信JSSDK工具类
 */
class WeixinJSSDK {
  constructor() {
    this.config = null
    this.readyCallback = null
  }

  /**
   * 初始化微信JSSDK配置
   * @param {Array} jsApiList - 需要使用的JS接口列表
   * @returns {Promise} - 初始化结果
   */
  async init(jsApiList = []) {
    return new Promise(async (resolve, reject) => {
      let configData = await this.getConfigFromServer()
      if (!configData || !configData.appId || !configData.timestamp || !configData.nonceStr || !configData.signature) {
        reject(new Error('获取微信JSSDK配置信息失败'))
        return
      }
      this.config = configData
      if( !configData ) {
        reject(new Error('获取微信JSSDK配置信息失败'))
        return
      }
      // 配置微信JS-SDK
      wx.config({
        debug: true, // 生产环境设为false
        appId: configData.appId,
        timestamp: configData.timestamp,
        nonceStr: configData.nonceStr,
        signature: configData.signature,
        jsApiList: [...jsApiList, 'scanQRCode'] // 默认包含扫码功能
      })

      // 配置成功回调
      wx.ready(() => {
        if (this.readyCallback) {
          this.readyCallback()
        }
        resolve(true)
      })

      // 配置失败回调
      wx.error((err) => {
        console.error('微信JSSDK配置失败:', err)
        reject(err)
      })
    })
  }

  /**
   * 设置SDK准备就绪回调
   * @param {Function} callback - 回调函数
   */
  onReady(callback) {
    if (typeof callback === 'function') {
      this.readyCallback = callback
    }
  }

  /**
   * 微信扫一扫功能
   * @param {Object} options - 扫描选项
   * @param {number} options.needResult - 是否直接返回扫描结果，0由微信处理，1直接返回
   * @param {boolean} options.onlyFromCamera - 是否只能从相机扫描
   * @param {Array} options.scanType - 扫描类型，如['qrCode', 'barCode']
   * @returns {Promise} - 扫描结果
   */
  scanQRCode(options = {}) {
    return new Promise((resolve, reject) => {
      const defaultOptions = {
        needResult: 1,
        scanType: ['qrCode']
      }

      const scanOptions = { ...defaultOptions, ...options }

      wx.scanQRCode({
        ...scanOptions,
        success: (res) => {
          console.log('扫描成功:', res)
          resolve(res)
        },
        fail: (err) => {
          console.error('扫描失败:', err)
          reject(err)
        }
      })
    })
  }

  /**
   * 从后端获取微信配置信息
   * @param {Function} apiCall - 获取配置的API调用函数
   * @returns {Promise<Object>} - 配置信息
   */
  async getConfigFromServer() {
    return new Promise(async (resolve, reject) => {
      try {
        const response = await $api.post(global.apiUrls.post68e4689b6e176,{
          href: location.href,
        })
        if (response.data && response.data.code === '1') {
          resolve(response.data.data)
        } else {
          reject(new Error('获取微信配置失败: ' + (response.data.msg || '未知错误')))
        }
      } catch (error) {
        console.error('获取微信配置时发生错误:', error)
        reject(error)
      }
    })
  }
}

// 导出单例实例
export default new WeixinJSSDK()